Computing devices include ever increasing number of processing cores. As the number of processing cores increases, high-performance computing (HPC) application software (“application”) and even driver software (“driver”) utilize increasing number of threads to perform tasks. Computer applications may be roughly divided into user applications and system applications. The user applications are computer software that may cause a computer to perform tasks other than running the computer itself. The system applications may include computer software that may be used to operate the computer. System applications may include drivers which are computer programs to control hardware devices. A driver may enable operating systems and applications to interact with hardware devices without needing to know the details of the hardware configuration. One or more processing cores may carry out the execution of computer applications in threads, each of which may be the smallest sequence of programmed instructions that may be handled independently by the operating system. However, more threads tend to create more data race conditions in a memory shared by multiple applications or threads. A data race condition may occur when two or more threads try to access a shared memory location. Data race conditions may be non-deterministic because the data content stored at the shared memory location depends on the thread scheduling algorithm. These non-deterministic data race conditions are hard to reproduce during the subsequent debug process.